import { get } from './index'
import {
  QUESTION_TYPE_DESCRIPTION,
  DRAW_SCHEMA,
  COLLECT_SCHEMA,
} from '@/constants/default'
import { getPath } from '@/utils/utils'
import { AxiosError } from 'axios'

function formatData(data) {
  const title = data.title
  const info = data.info
  let questions = data.questions

  let seq = 1 // 题目序号
  const qs = []
  let collectTemplate = []

  questions.forEach(q => {
    // sSchema 当前问题需要的数据类型
    const qSchema = JSON.parse(JSON.stringify(DRAW_SCHEMA[q.type])) // 深克隆,防止影响原对象
    // 根据所需的数据类型填充对应的值
    Object.keys(qSchema).forEach(key => {
      if (key === 'seq') {
        // 为题目添加序号 因为后台没有提供题目序号, 所以自己添加数据, 段落描述不会有 seq 值.
        qSchema[key] = seq++
      } else {
        // 其他的类型, 后台都应该有给我们
        qSchema[key] = q[key]
      }
    })
    qs.push(qSchema)

    // 为当前问题添加对应“收集模板”, 用于收集用户填写的数据
    if (q.type !== QUESTION_TYPE_DESCRIPTION) {
      let cSchema = JSON.parse(JSON.stringify(COLLECT_SCHEMA[q.type]))
      Object.keys(cSchema).forEach(key => {
        if (key === 'groups') {
          // 先为 groups 中的每一个小标题的 id 赋值
          q.subTitles.forEach(({ id }, i) => {
            cSchema[key][i] = { ...cSchema[key][0], id }
          })
        } else if (key === 'options' || key === 'text') {
          // text 和 options 都是应该由用户选择后再进行填充
          cSchema[key] = cSchema[key]
        } else {
          // 此处应该会有 id、required、type、text
          cSchema[key] = q[key]
        }
      })
      collectTemplate.push(cSchema)
    }
  })
  const drawTemplate = { title, info, questions: qs }
  return { drawTemplate, collectTemplate }
}

export default function () {
  return new Promise(async (res, rej) => {
    // 错误类型: 向后台请求, 但是后台报错(查询无结果), 此时提示 FAIL; 本地前端发送报错(超时), 此时响应 ERROR
    try {
      const {data:resData} = await get(`/user/survey/${getPath()}`)
      if (resData.msg === 'success') {
        res(formatData(resData.data))
        return
      }
      console.error(resData)
      rej('FAIL：' + resData.msg)
    } catch (error) {
      if (error instanceof AxiosError) {
        const response = error.response
        if (response.status === 404 || response.status === 500) {
          // 问卷不存在 || 未知错误
          rej(response.data.msg)
        }
        return
      }
      console.error(error)
      rej('出现未知错误, 请查看控制台')
    }
  })
}
